package com.zjsru.oneDay;

/**
 * 3443. K 次修改后的最大曼哈顿距离
 *
 * @Author: cookLee
 * @Date: 2025-06-20
 */
public class MaxDistance {

    /**
     * 主
     * \
     * 输入：s = "NWSE", k = 1
     * 输出：3
     * 解释：
     * 将 s[2] 从 'S' 改为 'N' ，字符串 s 变为 "NWNE" 。
     * 移动操作	位置 (x, y)	曼哈顿距离	最大值
     * s[0] == 'N'	(0, 1)	0 + 1 = 1	1
     * s[1] == 'W'	(-1, 1)	1 + 1 = 2	2
     * s[2] == 'N'	(-1, 2)	1 + 2 = 3	3
     * s[3] == 'E'	(0, 2)	0 + 2 = 2	3
     * 执行移动操作过程中，距离原点的最大曼哈顿距离是 3 。
     * \
     * 输入：s = "NSWWEW", k = 3
     * 输出：6
     * 解释：
     * 将 s[1] 从 'S' 改为 'N' ，将 s[4] 从 'E' 改为 'W' 。字符串 s 变为 "NNWWWW" 。
     * 执行移动操作过程中，距离原点的最大曼哈顿距离是 6 。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        MaxDistance maxDistance = new MaxDistance();
        String s = "NWSE";
        int k = 1;
        System.out.println(maxDistance.maxDistance(s, k));
    }

    /**
     * 最大距离:贪心
     *
     * @param s s
     * @param k k
     * @return int
     */
    public int maxDistance(String s, int k) {
        int ans = 0;
        int east = 0, west = 0;
        int north = 0, south = 0;
        for (int i = 0; i < s.toCharArray().length; i++) {
            char it = s.toCharArray()[i];
            switch (it) {
                case 'N':
                    north++;
                    break;
                case 'S':
                    south++;
                    break;
                case 'E':
                    east++;
                    break;
                case 'W':
                    west++;
                    break;
            }
            //修改横向或纵向中数量较少的字母,增量为2
            int time1 = Math.min(Math.min(north, south), k);
            int time2 = Math.min(Math.min(east, west), k - time1);
            ans = Math.max(ans, this.helper(north, south, time1) + this.helper(east, west, time2));

        }
        return ans;
    }

    private int helper(int north, int south, int time1) {
        return Math.abs(south - north) + time1 * 2;
    }

}
